package com.anan.service.impl;

import com.anan.constants.Constants;
import com.anan.mapper.ImgResourceMapper;
import com.anan.mapper.OpusMapper;
import com.anan.pojo.bo.ImgInfosBO;
import com.anan.pojo.bo.OpusInfoBO;
import com.anan.pojo.domain.ImgResourceDO;
import com.anan.pojo.domain.OpusDO;
import com.anan.pojo.dto.AddOpusDTO;
import com.anan.pojo.dto.AllOpusInfoDTO;
import com.anan.pojo.dto.ImgDTO;
import com.anan.pojo.dto.UdStatusOpusDTO;
import com.anan.service.OpusService;
import org.springframework.beans.BeanUtils;
import org.springframework.stereotype.Service;

import javax.annotation.Resource;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.List;

/**
 * @author anan
 * @date 2023/05/09/20:29
 **/
@Service
public class OpusServiceImpl implements OpusService {
    @Resource
    private OpusMapper opusMapper;

    @Resource
    private ImgResourceMapper imgResourceMapper;

    @Override
    public boolean addOpus(AddOpusDTO addOpusDTO) {
        if (null != addOpusDTO) {
            OpusDO opusDO = new OpusDO();
            BeanUtils.copyProperties(addOpusDTO, opusDO);
            //添加作品
            boolean flag1 = opusMapper.addOpus(opusDO);
            //添加关系
            ImgDTO imgDTO = new ImgDTO();
            List<ImgInfosBO> list = addOpusDTO.getImgInfosBOs();
            imgDTO.setImgInfosBOs(list);
            list.forEach(imgInfosBO -> {
                imgInfosBO.setRelateId(opusDO.getOpusId());
                imgInfosBO.setImgType(Constants.TYPE.OPUS);
            });

            boolean flag2 = imgResourceMapper.addImgs(imgDTO);
            return flag1 && flag2 ;
        }
        return false;
    }

    @Override
    public int addOneLike(Integer opusId) {
        if (null != opusId) {
            OpusDO opusDO = opusMapper.getOpusById(opusId);
            if (null != opusDO) {
                int likeNum = opusDO.getLikeNum() + 1;
                opusDO.setOpusId(likeNum);
                boolean flag = opusMapper.updateOpus(opusId, likeNum, null);
                if (flag) return likeNum;
            }
        }
        return 0;
    }

    @Override
    public AllOpusInfoDTO getAllOpus() {
        AllOpusInfoDTO allOpusInfoDTO = new AllOpusInfoDTO();
        List<OpusInfoBO> opusInfoList = new ArrayList<>();
        allOpusInfoDTO.setOpusInfoList(opusInfoList);
        //查询作品
        List<OpusDO> opusList = opusMapper.getOpusByIdAndStatus(null, Constants.OPUS_STATE.SHOW, Constants.ADMIN_STATUS.PASS);
        getOpusImgInfo(opusList, opusInfoList);
        return allOpusInfoDTO;
    }

    private void getOpusImgInfo(List<OpusDO> opusList, List<OpusInfoBO> opusInfoList) {
        if (null != opusList && opusList.size() > 0) {
            opusList.forEach(opusDO -> {
                OpusInfoBO opusInfoBO =  new OpusInfoBO();
                BeanUtils.copyProperties(opusDO, opusInfoBO);
                SimpleDateFormat dateFormat = new SimpleDateFormat("yyyy-MM-dd :hh:mm:ss");
                opusInfoBO.setCreateDate(dateFormat.format(opusDO.getCreateDate()));

                //查询作品的图片信息
                List<ImgResourceDO> imgResources = imgResourceMapper.getUrlByIdAndType(Constants.TYPE.OPUS, opusDO.getOpusId());
                List<ImgInfosBO> imgInfosList = new ArrayList<>();
                imgResources.forEach(imgResourceDO -> {
                    ImgInfosBO imgInfosBO = new ImgInfosBO();
                    BeanUtils.copyProperties(imgResourceDO, imgInfosBO);
                    imgInfosList.add(imgInfosBO);
                });
                opusInfoBO.setImgInfosList(imgInfosList);
                opusInfoList.add(opusInfoBO);
            });

        }
    }

    @Override
    public AllOpusInfoDTO get2AdminStatus() {
        AllOpusInfoDTO allOpusInfoDTO = new AllOpusInfoDTO();
        List<OpusInfoBO> opusInfoList = new ArrayList<>();
        allOpusInfoDTO.setOpusInfoList(opusInfoList);

        //查询作品
        List<OpusDO> opusList = opusMapper.getOpusByIdAndStatus(null, null, Constants.ADMIN_STATUS.NO_PASS);
        getOpusImgInfo(opusList, opusInfoList);
        return allOpusInfoDTO;
    }

    @Override
    public boolean updateShelvesStatus(UdStatusOpusDTO udStatusOpusDTO) {
        if (null != udStatusOpusDTO) {
            return opusMapper.updateShelvesStatus(udStatusOpusDTO.getOpusId(), udStatusOpusDTO.getStatus());
        }
        return false;
    }
}
